package com.lizonghui.googleplay.views;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.FrameLayout;

import com.lizonghui.googleplay.R;

/**
 * Created by Administrator on 2016/6/23.
 * 继承frameLayout更简单，不会自己创建什么东西
 * 创建自定义View，ratio比例
 * 1已知宽度，可以动态计算高度
 * 1已知高度，可以动态计算宽度
 */
public class RatioLayout extends FrameLayout{
    //已知条件，图片宽高比
    private float mPicRatio = 1.f;
    //公式
    // 图片宽高比 = RatioLayout.width/RatioLayout.height

    //在自定义控件中添加属性，获取我们选用哪种方式。1命名空间2在attrs中定义
    public static final int RELATIVE_WIDTH = 0;//已知宽度，可动态算高度
    public static final int RELATIVE_HEIGHT = 1;//已知高度，可动态算宽度
    private int mRelative = RELATIVE_HEIGHT;//默认

    //获取自定义属性，在构造方法中获取

    public RatioLayout(Context context) {
        super(context,null);
    }

    public RatioLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        //获取自定义属性
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioLayout);
        mRelative = typedArray.getInt(R.styleable.RatioLayout_relative, 0);
        mPicRatio = typedArray.getFloat(R.styleable.RatioLayout_picRatio,1);

        typedArray.recycle();//回收
    }

    public void setPicRatio(float picRatio) {
        mPicRatio = picRatio;
    }

    public void setRelative(int relative) {
        mRelative = relative;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        /**
         * 模式：UNSPECIFIED 不确定的 wrap_content
         *      EXACTLY     确定 match_parent 或者 100dp
         *      AT_MOST     至多
         */
        //得到RatioLayout在xml中定义的layout_width的模式
        int selfWidthMode = MeasureSpec.getMode(widthMeasureSpec);
        //得到RatioLayout在xml中定义的layout_height的模式
        int selfHeightMode = MeasureSpec.getMode(heightMeasureSpec);
        if(selfWidthMode == MeasureSpec.EXACTLY && mRelative == RELATIVE_WIDTH){//已知宽度，且方式为宽度已知方式
           //宽度是确定,得到宽度
            int selfWidth = MeasureSpec.getSize(widthMeasureSpec);

            //根据图片宽高比，计算出应该高度
            int selfHeight = (int) (selfWidth / mPicRatio + .5f);

            //为了防止孩子测绘时候改变宽高，会没有效果,而且这里孩子必须有，因为是frameLayout
            //请求孩子测绘自身，按照指定模式(size+mode)，但孩写还有效果
            int childWith = selfWidth - getPaddingLeft()-getPaddingRight();
            int childHeight = selfHeight - getPaddingBottom() - getPaddingTop();
            int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWith,MeasureSpec.EXACTLY);
            int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight,MeasureSpec.EXACTLY);
            measureChildren(childWidthMeasureSpec,childHeightMeasureSpec);

            //保存测绘结果
            setMeasuredDimension(selfWidth,selfHeight);

        }else if(selfHeightMode == MeasureSpec.EXACTLY && mRelative == RELATIVE_HEIGHT) {//已知高度，且方式为高度已知方式
            //高度确定，得到高度
            int selfHeight = MeasureSpec.getSize(selfHeightMode);

            //根据宽高比，计算出应有宽度
            int selfWidth = (int) (selfHeight * mPicRatio + .5f);

            //为了防止孩子测绘时候改变宽高，会没有效果,而且这里孩子必须有，因为是frameLayout
            //请求孩子测绘自身，按照指定模式(size+mode)，但孩写还有效果
            int childWith = selfWidth - getPaddingLeft()-getPaddingRight();
            int childHeight = selfHeight - getPaddingBottom() - getPaddingTop();
            int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWith,MeasureSpec.EXACTLY);
            int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeight,MeasureSpec.EXACTLY);
            measureChildren(childWidthMeasureSpec,childHeightMeasureSpec);

            //保存测绘结果
            setMeasuredDimension(selfWidth,selfHeight);
        }else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }
}
